/*
 * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.inspur.edp.bff.designtime.generator.entity.defaultvalue;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.inspur.edp.bff.designtime.generator.VmGeneratorContext;
import com.inspur.edp.bff.designtime.generator.entity.VmEntityGenContext;
import com.inspur.edp.bff.entity.defaultvalue.VoDefaultValue;
import com.inspur.edp.caf.generator.baseInfo.AnnotationInfo;
import com.inspur.edp.caf.generator.baseInfo.AnnotationType;
import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
import com.inspur.edp.caf.generator.item.ClassGenerator;
import com.inspur.edp.caf.generator.item.ClassGeneratorContext;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.TypeLiteral;

import java.util.ArrayList;
import java.util.HashMap;

public class DefaultValueGenerator extends ClassGenerator {
    private VmEntityGenContext entityGenContext;
    private VmGeneratorContext vmGenContext;

    public DefaultValueGenerator(VmEntityGenContext entityGenContext, VmGeneratorContext vmGenContext) {
        super(entityGenContext.getCompilationUnitInfo());
        this.entityGenContext = entityGenContext;
        this.vmGenContext = vmGenContext;
    }

    @Override
    protected ClassGeneratorContext createClassInfoContext() {
        ClassGeneratorContext genContext = new ClassGeneratorContext();
        vmGenContext.setDefaultValueTypeContext(genContext);
        return genContext;
    }

    @Override
    protected ArrayList<Modifier.ModifierKeyword> getAccessModifier() {
        ArrayList<Modifier.ModifierKeyword> list = new ArrayList<Modifier.ModifierKeyword>();
        list.add(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
        return list;
    }

    @Override
    protected String getName() {
        return vmGenContext.getVm().getDefaultValueClassName();
    }

//	protected String GetNameSpace()
//	{
//		return entityGenContext.getCommonModel().getEntityAssemblyInfo().getDefaultNamespace();
//	}

    @Override
    protected java.util.ArrayList<AnnotationInfo> getAttributeList() {
        java.util.ArrayList<AnnotationInfo> annotationInfos = new ArrayList<>();
        AnnotationInfo annotationInfo = new AnnotationInfo();
        TypeInfo typeInfo = new TypeInfo(JsonDeserialize.class);
        annotationInfo.setTypeInfo(typeInfo);
        annotationInfo.setAnnotationType(AnnotationType.Normal);
        HashMap<String, Expression> params = new HashMap<>();
        TypeLiteral type = ast.newTypeLiteral();
        type.setType(ast.newSimpleType(ast.newSimpleName(getConverterTypeName())));
        params.put("using", type);
        annotationInfo.setParams(params);

        annotationInfos.add(annotationInfo);
        return annotationInfos;
    }

//    protected java.util.ArrayList<AttributeInfo> GetAttributeList()
//    {
//        AttributeInfo tempVar = new AttributeInfo();
//        tempVar.AttributeName = JsonConverterAttribute.class.FullName;
//        tempVar.ArgumentList = new java.util.ArrayList<SyntaxNodeOrToken>(java.util.Arrays.asList(new SyntaxNodeOrToken[] { SyntaxFactory.AttributeArgument(SyntaxFactory.TypeOfExpression(SyntaxFactory.IdentifierName(getConverterTypeName()))) }));
//        return new java.util.ArrayList<AttributeInfo>(java.util.Arrays.asList(new AttributeInfo[] { tempVar }));
//    }


    private String getConverterTypeName() {
        return vmGenContext.getDefaultValueConverterName();
    }

    @Override
    protected TypeInfo setParentClass() {
        return new TypeInfo(VoDefaultValue.class);
    }
}
